Reactã®å®éšçæ©èœã§ããexperimental_useFormStateã䜿çšããé«åºŠãªãã©ãŒã ããªããŒã·ã§ã³ã«ã€ããŠè§£èª¬ããŸããæ¬ã¬ã€ãã§ã¯ãå®è£ æ¹æ³ãå©ç¹ããããŠå®çšçãªäŸã玹ä»ããŸãã
React experimental_useFormStateã«ãããã©ãŒã ããªããŒã·ã§ã³ã®åŒ·å
ãã©ãŒã ããªããŒã·ã§ã³ã¯ãçŸä»£ã®Webã¢ããªã±ãŒã·ã§ã³éçºã«ãããŠéåžžã«éèŠãªåŽé¢ã§ããããŒã¿æŽåæ§ãä¿èšŒãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããã·ã¹ãã å
šäœã«ãšã©ãŒãåºããã®ãé²ããŸããReactã¯ãã³ã³ããŒãã³ãããŒã¹ã®ã¢ãŒããã¯ãã£ãæã¡ããã©ãŒã ã®åŠçãšããªããŒã·ã§ã³ã«å¯ŸããŠæ°å€ãã®ã¢ãããŒããæäŸããŠããŸããReactã®å®éšçæ©èœãšããŠå°å
¥ãããexperimental_useFormStateããã¯ã¯ããµãŒããŒã¢ã¯ã·ã§ã³å
ã§çŽæ¥ãã©ãŒã ã®ç¶æ
ãšããªããŒã·ã§ã³ã管çããããã®åŒ·åã§åççãªæ¹æ³ãæäŸããããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããšããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå®çŸããŸãã
experimental_useFormStateãçè§£ãã
experimental_useFormStateããã¯ã¯ãç¹ã«ãµãŒããŒã¢ã¯ã·ã§ã³ãšé£æºããéã®ãã©ãŒã ç¶æ
ã®ç®¡çããã»ã¹ãç°¡çŽ åããããã«èšèšãããŠããŸããããäžã€ã®å®éšçæ©èœã§ãããµãŒããŒã¢ã¯ã·ã§ã³ã¯ããµãŒããŒäžã§å®çŸ©ãã颿°ãReactã³ã³ããŒãã³ãããçŽæ¥åŒã³åºãããšãå¯èœã«ããŸããexperimental_useFormStateã¯ããµãŒããŒã¢ã¯ã·ã§ã³ã®çµæã«åºã¥ããŠãã©ãŒã ã®ç¶æ
ãæŽæ°ããã¡ã«ããºã ãæäŸãããªã¢ã«ã¿ã€ã ã®ããªããŒã·ã§ã³ãšãã£ãŒãããã¯ã容æã«ããŸãã
äž»ãªå©ç¹ïŒ
- ãã©ãŒã 管çã®ç°¡çŽ åïŒ ã³ã³ããŒãã³ãå ã§ãã©ãŒã ã®ç¶æ ãšããªããŒã·ã§ã³ããžãã¯ãäžå 管çããŸãã
- ãµãŒããŒãµã€ãããªããŒã·ã§ã³ïŒ ãµãŒããŒã§ã®ããªããŒã·ã§ã³ãå¯èœã«ããããŒã¿ã®æŽåæ§ãšã»ãã¥ãªãã£ã確ä¿ããŸãã
- ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãïŒ JavaScriptãç¡å¹ãªå Žåã§ãã·ãŒã ã¬ã¹ã«åäœããåºæ¬çãªãã©ãŒã éä¿¡äœéšãæäŸããŸãã
- ãªã¢ã«ã¿ã€ã ãã£ãŒãããã¯ïŒ ããªããŒã·ã§ã³çµæã«åºã¥ãããŠãŒã¶ãŒã«å³åº§ã«ãã£ãŒãããã¯ãæäŸããŸãã
- ãã€ã©ãŒãã¬ãŒãã®åæžïŒ ãã©ãŒã ã®ç¶æ ãšããªããŒã·ã§ã³ã®åŠçã«å¿ èŠãªã³ãŒãéãæå°éã«æããŸãã
experimental_useFormStateã®å®è£
ããã§ã¯ãexperimental_useFormStateãå®è£
ããå®è·µçãªäŸã詳ããèŠãŠãããŸããããåºæ¬çãªããªããŒã·ã§ã³ã«ãŒã«ïŒäŸïŒå¿
é ãã£ãŒã«ããã¡ãŒã«åœ¢åŒïŒãæã€ç°¡åãªç»é²ãã©ãŒã ãäœæããŸãããã®äŸã§ã¯ãããã¯ããµãŒããŒã¢ã¯ã·ã§ã³ãšçµ±åããŠãã©ãŒã ããŒã¿ãæ€èšŒããæ¹æ³ã瀺ããŸãã
äŸïŒç»é²ãã©ãŒã
ãŸãããã©ãŒã ã®éä¿¡ãšããªããŒã·ã§ã³ãåŠçãããµãŒããŒã¢ã¯ã·ã§ã³ãå®çŸ©ããŸãããã®ã¢ã¯ã·ã§ã³ã¯ãã©ãŒã ããŒã¿ãåãåããããªããŒã·ã§ã³ã«å€±æããå Žåã¯ãšã©ãŒã¡ãã»ãŒãžãè¿ããŸãã
// server-actions.jsïŒããã¯è¡šçŸã®äžäŸã§ãããµãŒããŒã¢ã¯ã·ã§ã³ã®æ£ç¢ºãªå®è£
ã¯ãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠç°ãªããŸããïŒ
"use server";
export async function registerUser(prevState, formData) {
const name = formData.get('name');
const email = formData.get('email');
const password = formData.get('password');
// ç°¡åãªããªããŒã·ã§ã³
if (!name) {
return { message: 'ååã¯å¿
é ã§ã' };
}
if (!email || !email.includes('@')) {
return { message: 'ã¡ãŒã«åœ¢åŒãç¡å¹ã§ã' };
}
if (!password || password.length < 8) {
return { message: 'ãã¹ã¯ãŒãã¯8æå以äžã§ããå¿
èŠããããŸã' };
}
// ãŠãŒã¶ãŒç»é²ãã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, 1000)); // APIåŒã³åºããã·ãã¥ã¬ãŒã
return { message: 'ç»é²ãæåããŸããïŒ' };
}
次ã«ãexperimental_useFormStateã䜿çšããŠãã©ãŒã ã管çãããµãŒããŒã¢ã¯ã·ã§ã³ãšé£æºããReactã³ã³ããŒãã³ããäœæããŸãããã
// RegistrationForm.jsx
'use client';
import React from 'react';
import { experimental_useFormState as useFormState } from 'react-dom';
import { registerUser } from './server-actions';
function RegistrationForm() {
const [state, formAction] = useFormState(registerUser, { message: null });
return (
);
}
export default RegistrationForm;
解説ïŒ
experimental_useFormStateãšregisterUserãµãŒããŒã¢ã¯ã·ã§ã³ãã€ã³ããŒãããŸããuseFormState(registerUser, { message: null })ã§ããã¯ãåæåããŸããæåã®åŒæ°ã¯ãµãŒããŒã¢ã¯ã·ã§ã³ã§ã2çªç®ã¯åæç¶æ ã§ãããã®å Žåãåæç¶æ ã¯messageããããã£ãnullã«èšå®ãããŠããŸãã- ããã¯ã¯çŸåšã®ç¶æ
ïŒ
stateïŒãšãµãŒããŒã¢ã¯ã·ã§ã³ãããªã¬ãŒãã颿°ïŒformActionïŒãå«ãé åãè¿ããŸãã <form>èŠçŽ ã®action屿§ãformActionã«èšå®ããŸããããã«ããããã©ãŒã ãéä¿¡ããããšãã«ReactããµãŒããŒã¢ã¯ã·ã§ã³ã䜿çšããããã«æç€ºããŸããstate?.messageã¯ããµãŒããŒã¢ã¯ã·ã§ã³ããè¿ããããšã©ãŒã¡ãã»ãŒãžãæåã¡ãã»ãŒãžã衚瀺ããããã«æ¡ä»¶ä»ãã§ã¬ã³ããªã³ã°ãããŸãã
é«åºŠãªããªããŒã·ã§ã³ãã¯ããã¯
åã®äŸã§ã¯åºæ¬çãªããªããŒã·ã§ã³ã瀺ããŸããããããæŽç·ŽãããããªããŒã·ã§ã³ãã¯ããã¯ãçµã¿èŸŒãããšãã§ããŸãã以äžã«ããã€ãã®é«åºŠãªæŠç¥ã玹ä»ããŸãã
- æ£èŠè¡šçŸïŒ é»è©±çªå·ãéµäŸ¿çªå·ãã¯ã¬ãžããã«ãŒãçªå·ãªã©ã®è€éãªãã¿ãŒã³ãæ€èšŒããããã«æ£èŠè¡šçŸã䜿çšããŸããããŒã¿ã®åœ¢åŒã«ãããæåçãªéãïŒäŸïŒé»è©±çªå·ã®åœ¢åŒã¯åœã«ãã£ãŠå€§ããç°ãªãïŒãèæ ®ããŠãã ããã
- ã«ã¹ã¿ã ããªããŒã·ã§ã³é¢æ°ïŒ ããè€éãªããªããŒã·ã§ã³ããžãã¯ãå®è£ ããããã«ãã«ã¹ã¿ã ããªããŒã·ã§ã³é¢æ°ãäœæããŸããäŸãã°ããŠãŒã¶ãŒåãæ¢ã«äœ¿çšãããŠãããããŸãã¯ãã¹ã¯ãŒããç¹å®ã®åºæºïŒäŸïŒæå°é·ãç¹æ®æåïŒãæºãããŠãããã確èªããå¿ èŠããããããããŸããã
- ãµãŒãããŒãã£ã®ããªããŒã·ã§ã³ã©ã€ãã©ãªïŒ ZodãYupãJoiãªã©ã®ãµãŒãããŒãã£ã®ããªããŒã·ã§ã³ã©ã€ãã©ãªã掻çšããŠãããå ç¢ã§æ©èœè±å¯ãªããªããŒã·ã§ã³ãå®çŸããŸãããããã®ã©ã€ãã©ãªã¯ãã¹ããŒãããŒã¹ã®ããªããŒã·ã§ã³ãæäŸããããšãå€ããããªããŒã·ã§ã³ã«ãŒã«ã®å®çŸ©ãšé©çšã容æã«ãªããŸãã
äŸïŒZodã䜿çšããããªããŒã·ã§ã³
Zodã¯ã人æ°ã®ããTypeScriptãã¡ãŒã¹ãã®ã¹ããŒã宣èšããã³ããªããŒã·ã§ã³ã©ã€ãã©ãªã§ããZodãç»é²ãã©ãŒã ã®äŸã«çµ±åããŠã¿ãŸãããã
// server-actions.js
"use server";
import { z } from 'zod';
const registrationSchema = z.object({
name: z.string().min(2, { message: "ååã¯2æå以äžã§ããå¿
èŠããããŸãã" }),
email: z.string().email({ message: "ç¡å¹ãªã¡ãŒã«ã¢ãã¬ã¹ã§ã" }),
password: z.string().min(8, { message: "ãã¹ã¯ãŒãã¯8æå以äžã§ããå¿
èŠããããŸãã" }),
});
export async function registerUser(prevState, formData) {
const data = Object.fromEntries(formData);
try {
const validatedData = registrationSchema.parse(data);
// ãŠãŒã¶ãŒç»é²ãã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, 1000)); // APIåŒã³åºããã·ãã¥ã¬ãŒã
return { message: 'ç»é²ãæåããŸããïŒ' };
} catch (error) {
if (error instanceof z.ZodError) {
return { message: error.errors[0].message };
} else {
return { message: 'äºæãã¬ãšã©ãŒãçºçããŸããã' };
}
}
}
解説ïŒ
zodã©ã€ãã©ãªããzãªããžã§ã¯ããã€ã³ããŒãããŸãã- Zodã䜿çšããŠ
registrationSchemaãå®çŸ©ããåãã£ãŒã«ãã®ããªããŒã·ã§ã³ã«ãŒã«ãæå®ããŸããããã«ã¯ãæå°é·ã®èŠä»¶ãã¡ãŒã«åœ¢åŒã®ããªããŒã·ã§ã³ãå«ãŸããŸãã registerUserãµãŒããŒã¢ã¯ã·ã§ã³å ã§ãregistrationSchema.parse(data)ã䜿çšããŠãã©ãŒã ããŒã¿ãæ€èšŒããŸãã- ããªããŒã·ã§ã³ã«å€±æãããšãZodã¯
ZodErrorãã¹ããŒããŸãããã®ãšã©ãŒããã£ããããã¯ã©ã€ã¢ã³ãã«é©åãªãšã©ãŒã¡ãã»ãŒãžãè¿ããŸãã
ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé
ãã©ãŒã ããªããŒã·ã§ã³ãå®è£ ããéã«ã¯ãã¢ã¯ã»ã·ããªãã£ãèæ ®ããããšãäžå¯æ¬ ã§ããé害ãæã€äººã ããã©ãŒã ã䜿çšã§ããããã«ããŠãã ããã以äžã«ãäž»èŠãªã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé ãæããŸãã
- æç¢ºã§åããããããšã©ãŒã¡ãã»ãŒãžïŒ äœãåé¡ã§ãã©ãããã°ä¿®æ£ã§ãããã説æãããæç¢ºã§åããããããšã©ãŒã¡ãã»ãŒãžãæäŸããŸããARIA屿§ã䜿çšããŠããšã©ãŒã¡ãã»ãŒãžã察å¿ãããã©ãŒã ãã£ãŒã«ãã«é¢é£ä»ããŸãã
- ããŒããŒãããã²ãŒã·ã§ã³ïŒ ãã¹ãŠã®ãã©ãŒã èŠçŽ ãããŒããŒãã§ã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŸãããŠãŒã¶ãŒã¯TabããŒã䜿çšããŠãã©ãŒã å ãç§»åã§ããå¿ èŠããããŸãã
- ã¹ã¯ãªãŒã³ãªãŒããŒã®äºææ§ïŒ ã»ãã³ãã£ãã¯HTMLãšARIA屿§ã䜿çšããŠããã©ãŒã ãã¹ã¯ãªãŒã³ãªãŒããŒãšäºææ§ã®ãããã®ã«ããŸããã¹ã¯ãªãŒã³ãªãŒããŒã¯ãšã©ãŒã¡ãã»ãŒãžãèªã¿äžãããŠãŒã¶ãŒã«ã¬ã€ãã³ã¹ãæäŸã§ããå¿ èŠããããŸãã
- ååãªã³ã³ãã©ã¹ãïŒ ãã©ãŒã èŠçŽ ã®ããã¹ããšèæ¯è²ã®éã«ååãªã³ã³ãã©ã¹ããããããšã確èªããŸããããã¯ç¹ã«ãšã©ãŒã¡ãã»ãŒãžã§éèŠã§ãã
- ãã©ãŒã ã©ãã«ïŒ åå ¥åãã£ãŒã«ãã«ã©ãã«ãé¢é£ä»ãã`for`屿§ã䜿çšããŠã©ãã«ãšå ¥åãæ£ããçµã³ã€ããŸãã
äŸïŒã¢ã¯ã»ã·ããªãã£ã®ããã®ARIA屿§ã®è¿œå
// RegistrationForm.jsx
'use client';
import React from 'react';
import { experimental_useFormState as useFormState } from 'react-dom';
import { registerUser } from './server-actions';
function RegistrationForm() {
const [state, formAction] = useFormState(registerUser, { message: null });
return (
);
}
export default RegistrationForm;
解説ïŒ
aria-invalid={!!state?.message}ïŒãšã©ãŒã¡ãã»ãŒãžãããå Žåã«aria-invalid屿§ãtrueã«èšå®ããå ¥åãç¡å¹ã§ããããšã瀺ããŸããaria-describedby="name-error"ïŒaria-describedby屿§ã䜿çšããŠãå ¥åãšãšã©ãŒã¡ãã»ãŒãžãé¢é£ä»ããŸããaria-live="polite"ïŒã¹ã¯ãªãŒã³ãªãŒããŒã«å¯Ÿãããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããéã«ãããèªã¿äžããããæç€ºããŸãã
åœéåïŒi18nïŒã«é¢ããèæ ®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã察象ãšããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãåœéåïŒi18nïŒãäžå¯æ¬ ã§ãããã©ãŒã ããªããŒã·ã§ã³ãå®è£ ããéã«ã¯ã以äžã®i18nã®åŽé¢ãèæ ®ããŠãã ããã
- ããŒã«ã©ã€ãºããããšã©ãŒã¡ãã»ãŒãžïŒ ãŠãŒã¶ãŒã®åªå èšèªã§ãšã©ãŒã¡ãã»ãŒãžãæäŸããŸããi18nã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã䜿çšããŠç¿»èš³ã管çããŸãã
- æ¥ä»ãšæ°å€ã®åœ¢åŒïŒ ãŠãŒã¶ãŒã®ãã±ãŒã«ã«å¿ããŠæ¥ä»ãšæ°å€ã®å ¥åãæ€èšŒããŸããæ¥ä»ã®åœ¢åŒãæ°å€ã®åºåãæåã¯åœã«ãã£ãŠå€§ããç°ãªããŸãã
- äœæã®ããªããŒã·ã§ã³ïŒ ãŠãŒã¶ãŒã®åœã®ç¹å®ã®äœæåœ¢åŒã«ãŒã«ã«åºã¥ããŠäœæãæ€èšŒããŸããäœæã®åœ¢åŒã¯äžçäžã§å€§ããç°ãªããŸãã
- å³ããå·ŠãžïŒRTLïŒã®ãµããŒãïŒ ã¢ã©ãã¢èªãããã©ã€èªãªã©ã®RTLèšèªã§ãã©ãŒã ãæ£ãã衚瀺ãããããšã確èªããŸãã
äŸïŒãšã©ãŒã¡ãã»ãŒãžã®ããŒã«ã©ã€ãº
ããŒã«ã©ã€ãºããããšã©ãŒã¡ãã»ãŒãžãå«ã翻蚳ãã¡ã€ã«ïŒäŸïŒen.jsonãfr.jsonïŒããããšä»®å®ããŸãã
// en.json
{
"nameRequired": "Name is required",
"invalidEmail": "Invalid email address",
"passwordTooShort": "Password must be at least 8 characters"
}
// fr.json
{
"nameRequired": "Le nom est obligatoire",
"invalidEmail": "Adresse email invalide",
"passwordTooShort": "Le mot de passe doit comporter au moins 8 caractÚres"
}
// server-actions.js
"use server";
import { z } from 'zod';
// ãŠãŒã¶ãŒã®ãã±ãŒã«ãååŸãã颿°ããããšä»®å®
import { getLocale } from './i18n';
import translations from './translations';
const registrationSchema = z.object({
name: z.string().min(2, { message: "nameRequired" }),
email: z.string().email({ message: "invalidEmail" }),
password: z.string().min(8, { message: "passwordTooShort" }),
});
export async function registerUser(prevState, formData) {
const data = Object.fromEntries(formData);
const locale = getLocale(); // ãŠãŒã¶ãŒã®ãã±ãŒã«ãååŸ
const t = translations[locale] || translations['en']; //è±èªã«ãã©ãŒã«ããã¯
try {
const validatedData = registrationSchema.parse(data);
// ãŠãŒã¶ãŒç»é²ãã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, 1000)); // APIåŒã³åºããã·ãã¥ã¬ãŒã
return { message: t['registrationSuccessful'] || 'ç»é²ãæåããŸããïŒ' };
} catch (error) {
if (error instanceof z.ZodError) {
return { message: t[error.errors[0].message] || 'ããªããŒã·ã§ã³ãšã©ãŒ' };
} else {
return { message: t['unexpectedError'] || 'äºæãã¬ãšã©ãŒãçºçããŸããã' };
}
}
}
ãµãŒããŒãµã€ãããªããŒã·ã§ã³ã®å©ç¹
ã¯ã©ã€ã¢ã³ããµã€ãã®ããªããŒã·ã§ã³ã¯ãŠãŒã¶ãŒã«å³åº§ã«ãã£ãŒãããã¯ãæäŸããããã«éèŠã§ããããµãŒããŒãµã€ãã®ããªããŒã·ã§ã³ã¯ã»ãã¥ãªãã£ãšããŒã¿æŽåæ§ã®ããã«äžå¯æ¬ ã§ãã以äžã«ããµãŒããŒãµã€ãããªããŒã·ã§ã³ã®äž»ãªå©ç¹ãæããŸãã
- ã»ãã¥ãªãã£ïŒ æªæã®ãããŠãŒã¶ãŒãã¯ã©ã€ã¢ã³ããµã€ãã®ããªããŒã·ã§ã³ãåé¿ããŠãç¡å¹ãŸãã¯æå®³ãªããŒã¿ãéä¿¡ããã®ãé²ããŸãã
- ããŒã¿æŽåæ§ïŒ ããŒã¿ããŒã¹ã«ä¿åãããããŒã¿ãæå¹ã§äžè²«æ§ãããããšãä¿èšŒããŸãã
- ããžãã¹ããžãã¯ã®åŒ·å¶ïŒ ã¯ã©ã€ã¢ã³ããµã€ãã§ã¯å®¹æã«å®è£ ã§ããªãè€éãªããžãã¹ã«ãŒã«ã匷å¶ããããšãã§ããŸãã
- ã³ã³ãã©ã€ã¢ã³ã¹ïŒ ããŒã¿ãã©ã€ãã·ãŒèŠå¶ãã»ãã¥ãªãã£åºæºãžã®æºæ ã«åœ¹ç«ã¡ãŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
experimental_useFormStateãå®è£
ããéã«ã¯ããµãŒããŒã¢ã¯ã·ã§ã³ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ
®ããŠãã ãããéå°ãŸãã¯éå¹çãªãµãŒããŒã¢ã¯ã·ã§ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã以äžã«ãããã€ãã®ããã©ãŒãã³ã¹æé©åã®ãã³ããæããŸãã
- ãµãŒããŒã¢ã¯ã·ã§ã³åŒã³åºãã®æå°åïŒ äžå¿ èŠãªãµãŒããŒã¢ã¯ã·ã§ã³ã®åŒã³åºããé¿ããŸããå ¥åã€ãã³ãããããŠã³ã¹ãŸãã¯ã¹ãããã«ããŠãããªããŒã·ã§ã³ãªã¯ãšã¹ãã®é »åºŠãæžãããŸãã
- ãµãŒããŒã¢ã¯ã·ã§ã³ããžãã¯ã®æé©åïŒ ãµãŒããŒã¢ã¯ã·ã§ã³å ã®ã³ãŒããæé©åããŠãå®è¡æéãæå°éã«æããŸããå¹ççãªã¢ã«ãŽãªãºã ãšããŒã¿æ§é ã䜿çšããŸãã
- ãã£ãã·ã³ã°ïŒ é »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ããã£ãã·ã¥ããŠãããŒã¿ããŒã¹ãžã®è² è·ã軜æžããŸãã
- ã³ãŒãåå²ïŒ ã³ãŒãåå²ãå®è£ ããŠãã¢ããªã±ãŒã·ã§ã³ã®åæèªã¿èŸŒã¿æéãççž®ããŸãã
- CDNã®äœ¿çšïŒ ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒããéçã¢ã»ãããé ä¿¡ããŠãèªã¿èŸŒã¿é床ãåäžãããŸãã
å®äžçã§ã®äœ¿çšäŸ
experimental_useFormStateãç¹ã«æçãªããã€ãã®å®äžçã®ã·ããªãªãæ¢ã£ãŠã¿ãŸãããã
- Eã³ããŒã¹ã®ãã§ãã¯ã¢ãŠããã©ãŒã ïŒ Eã³ããŒã¹ã®ãã§ãã¯ã¢ãŠããããŒã§ãé éå äœæãæ¯æãæ å ±ãè«æ±å è©³çŽ°ãæ€èšŒããŸãã
- ãŠãŒã¶ãŒãããã¡ã€ã«ç®¡çïŒ ååãã¡ãŒã«ã¢ãã¬ã¹ãé»è©±çªå·ãªã©ã®ãŠãŒã¶ãŒãããã¡ã€ã«æ å ±ãæ€èšŒããŸãã
- ã³ã³ãã³ã管çã·ã¹ãã ïŒCMSïŒïŒ èšäºãããã°æçš¿ã補å説æãªã©ã®ã³ã³ãã³ããšã³ããªãæ€èšŒããŸãã
- éèã¢ããªã±ãŒã·ã§ã³ïŒ ååŒéé¡ãå£åº§çªå·ãã«ãŒãã£ã³ã°ãã³ããŒãªã©ã®éèããŒã¿ãæ€èšŒããŸãã
- ãã«ã¹ã±ã¢ã¢ããªã±ãŒã·ã§ã³ïŒ ç æŽãã¢ã¬ã«ã®ãŒãæè¬ãªã©ã®æ£è ããŒã¿ãæ€èšŒããŸãã
ãã¹ããã©ã¯ãã£ã¹
experimental_useFormStateãæå€§éã«æŽ»çšããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
- ãµãŒããŒã¢ã¯ã·ã§ã³ãå°ãããçŠç¹ãçµãïŒ ç¹å®ã®ã¿ã¹ã¯ãå®è¡ããããã«ãµãŒããŒã¢ã¯ã·ã§ã³ãèšèšããŸããé床ã«è€éãªãµãŒããŒã¢ã¯ã·ã§ã³ã®äœæã¯é¿ããŠãã ããã
- æå³ã®ããç¶æ æŽæ°ã䜿çšããïŒ ãšã©ãŒã¡ãã»ãŒãžãæåã€ã³ãžã±ãŒã¿ãªã©ãæå³ã®ããæ å ±ã§ãã©ãŒã ã®ç¶æ ãæŽæ°ããŸãã
- æç¢ºãªãŠãŒã¶ãŒãã£ãŒãããã¯ãæäŸããïŒ ãã©ãŒã ã®ç¶æ ã«åºã¥ããŠããŠãŒã¶ãŒã«æç¢ºã§æçãªãã£ãŒãããã¯ã衚瀺ããŸãã
- 培åºçã«ãã¹ãããïŒ ãã©ãŒã ãæ£ããæ©èœããèãããããã¹ãŠã®ã·ããªãªãåŠçããŠããããšã確èªããããã«ã培åºçã«ãã¹ãããŸããããã«ã¯ãåäœãã¹ããçµ±åãã¹ãããšã³ãããŒãšã³ããã¹ããå«ãŸããŸãã
- ææ°æ
å ±ãä¿ã€ïŒ Reactãš
experimental_useFormStateã«é¢ããææ°ã®ã¢ããããŒãããã¹ããã©ã¯ãã£ã¹ãåžžã«ææ¡ããŠãããŸãããã
çµè«
Reactã®experimental_useFormStateããã¯ã¯ãç¹ã«ãµãŒããŒã¢ã¯ã·ã§ã³ãšçµã¿åãããããšã§ããã©ãŒã ã®ç¶æ
ãšããªããŒã·ã§ã³ã管çããããã®åŒ·åã§å¹ççãªæ¹æ³ãæäŸããŸãããã®ããã¯ã掻çšããããšã§ããã©ãŒã åŠçã®ããžãã¯ãåçåãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããŒã¿æŽåæ§ã確ä¿ã§ããŸãããã©ãŒã ããªããŒã·ã§ã³ãå®è£
ããéã«ã¯ãã¢ã¯ã»ã·ããªãã£ãåœéåãããã©ãŒãã³ã¹ãèæ
®ããããšãå¿ããªãã§ãã ããããã®ã¬ã€ãã§æŠèª¬ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãWebã¢ããªã±ãŒã·ã§ã³ã匷åããå
ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãã©ãŒã ãäœæã§ããŸãã
experimental_useFormStateãé²åãç¶ããäžã§ãææ°ã®ã¢ããããŒãããã¹ããã©ã¯ãã£ã¹ã«ã€ããŠåžžã«æ
å ±ãåŸãããšãéèŠã§ãããã®é©æ°çãªæ©èœãåãå
¥ãããã©ãŒã ããªããŒã·ã§ã³æŠç¥ãæ°ããªé«ã¿ãžãšåŒãäžããŸãããã